作为一种函数式编程语言,Scheme的语法结构肥肠简洁:整个语言由5个关键字和8个语法形式构成(Python有33个关键字和110个语法形式,Java有50个关键字和133个语法形式),因此比较适合我这种弱鸡用来上手学习编译原理的一些皮毛
Scheme是大名鼎鼎的Lisp的一种方言,一种 functional programming language ,和Lisp一样有着多到想吐的括号。语法其实很简单,就是把函数和参数都用括号括起来,函数名放在最前面: 1
2
3
4(+ 2 3)
(- 9 1)
(/ 6 2)
(define a 3)
类似这样。
对比大多数编程语言,Scheme有着非常简洁的语法规则: * Scheme程序中只有表达式。表达式和声明之间并无区别。 * 数字(例如 1)和符号(例如 A)被称之为原子表达式(atomic expression);他们无法被拆分成更小的表达式。这部分和Java类似,但在Scheme中,诸如 + 和 > 这种操作符也被认为是符号(symbol),处理方式与A或是fn这种符号别无二致。 * 除此之外的一切都是列表表达式(list expression):以“(”为首,“)”为尾,中间包括着零个或更多表达式。列表的第一个元素决定了它的含义: * 若第一个元素是关键字,例如(if …),那这个列表是一个特殊形式(special form);特殊形式的意义取决于关键字。 * 若第一个元素并非关键字,例如(fn …),那这个列表则是函数调用。
千里之行始于足下,我们先从最简单的Lispy计算器开始,逐步添加内容,最终实现一个功能相对完整的Scheme解释器
0x0000 Lispy计算器
Lispy计算器可以被认为是一个使用Lisp语法的普通计算器,实现了以下5种语法形式:
Expression | Syntax |
---|---|
变量引用 | var |
字面常量 | number |
条件 | (if predicate consquent alternative) |
定义 | (define var exp) |
过程调用 | (proc arg…) |
基本上就是Scheme的一个子集。
词法分析及语法分析
解释器解释代码的过程,本身就是按照既定的语法规则,将输入的代码存储在一种称为“抽象语法树”的数据结构中,并遍历的过程。这里我们使用List来储存这棵树。因此一开始要做的事就很明确了:
1.词法分析: 将输入的字符串转变成一系列的token。
2.语法分析: 将上一步获得的token按语法规则储存为抽象语法树。